﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;

using System.Text;
using System.Windows.Forms;
using System.Collections;

using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
using System.Threading;
using System.IO;

namespace INSAForManagers
{
    public partial class FormElemnets : Form
    {
        private DataTable tbl = null;        
        private ArrayList colNames = new ArrayList();
        private string [] fieldName = { "M_ITEM1", "M_ITEM2", "M_ITEM3", "M_ITEM4", "M_ITEM5" };
        private FormMain parent;
        //private int indexOfElement;

        public FormElemnets(FormMain p)
        {
            InitializeComponent();
            parent = p;
            Control.CheckForIllegalCrossThreadCalls = false;
            tbl = new DataTable();
        }

        /*
         * 이벤트 모음
         * */
        
        private void FormElemnets_Load(object sender, EventArgs e)
        {
            try
            {
                addGridViewColumns();

                //tbl.Rows.Clear();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

       

        /**
         * 메서드 모음
         * */

        private void addGridViewColumns()
        {
            DataColumn col;

            int valuer_num = Config.ValuerList.Count;

            //연번
            col = new DataColumn();
            col.DataType = Type.GetType("System.Int32");
            col.ColumnName = "연번";
            colNames.Add("연번");
            col.AllowDBNull = false;
            col.ReadOnly = true;
            tbl.Columns.Add(col);

            //개인번호
            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "개인번호";
            colNames.Add("개인번호");
            col.AllowDBNull = false;
            col.ReadOnly = true;
            tbl.Columns.Add(col);

            //대상자 성명
            col = new DataColumn();
            col.DataType = Type.GetType("System.String");
            col.ColumnName = "평가대상자";
            colNames.Add("평가대상자");
            col.AllowDBNull = false;
            col.ReadOnly = true;
            tbl.Columns.Add(col);

            for (int i = 0; i < valuer_num; i++) {
                //평가자
                col = new DataColumn();
                col.DataType = Type.GetType("System.Double");
                col.ColumnName = DBUtil.getValuerName(Config.ValuerList[i].ToString());
                colNames.Add(DBUtil.getValuerName(Config.ValuerList[i].ToString()));
                col.AllowDBNull = true;
                col.ReadOnly = false;
                tbl.Columns.Add(col);                
            }

            //계
            col = new DataColumn();
            col.DataType = Type.GetType("System.Double");
            col.ColumnName = "계";
            colNames.Add("계");
            col.AllowDBNull = true;
            col.ReadOnly = false;
            tbl.Columns.Add(col);
                        

            //평균
            col = new DataColumn();
            col.DataType = Type.GetType("System.Double");
            col.ColumnName = "평균";
            colNames.Add("평균");
            col.AllowDBNull = true;
            col.ReadOnly = false;
            tbl.Columns.Add(col);            
       
            grdElementList.DataSource = tbl;

            grdElementList.Columns[1].Visible = false;

            for (int i = 0; i < valuer_num; i++)
            {
                grdElementList.Columns[DBUtil.getValuerName(Config.ValuerList[i].ToString())].DefaultCellStyle.Format = "#0.000";
            }

            grdElementList.Columns[2].Frozen = true;
            grdElementList.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            grdElementList.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

            grdElementList.Columns[0].Width = 40;
            grdElementList.Columns[1].Width = 80;
            grdElementList.Columns[2].Width = 80;


            grdElementList.Columns["계"].DefaultCellStyle.Format = "#0.000";
            grdElementList.Columns["계"].DefaultCellStyle.BackColor = Color.LightGray;
            grdElementList.Columns["계"].Width = 70;
            grdElementList.Columns["평균"].DefaultCellStyle.Format = "#0.000";
            grdElementList.Columns["평균"].DefaultCellStyle.BackColor = Color.LightGray;
            grdElementList.Columns["평균"].Width = 70;
            grdElementList.Columns["개인번호"].Visible = false;
            
        }

        private void brnCalc_Click(object sender, EventArgs e)
        {
            try
            {
                if (cboElement.SelectedIndex == -1)
                {
                    MessageBox.Show("평가요소를 먼저 선택하세요!    ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    cboElement.Focus();
                    return;
                }

                //다면평가대상자 유형별 인원수
                int nRow = DBUtil.getMTargetCount(getTargetType());

                //평가자 수
                int nValuer = DBUtil.getValuerList().Count;  

                if (nValuer < 3)
                {
                    MessageBox.Show("다면평가자가 3명 이상이어야 합니다.    ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                for (int i = 0; i < nRow; i++) //열의 개수만 큼 루프
                {
                    DataRow row = tbl.Rows[i];//열 객체

                    //평가자 수 크기의 더블형 배열을 선언
                    double[] d = new double[nValuer];

                    //평가자 본인의 경우 본인의 배점은 0.0 이므로 평가자 수에서 제외하기 위해 별도로 카운트함
                    int index = 0;

                    //평가자 수 만큼 루프
                    for (int j = 0; j < nValuer; j++)
                    {
                        //각 평가자의 해당 요소 배점을 그리드에서 읽어서 배열 값에 할당
                        double tmp = (double)row[3 + j]; 
                        d[j] = tmp;
                        if(tmp > 0.0){
                            index++;
                        }
                    }

                    if (index > 3) //다면평가자 수가 3명 보다 많을 경우에는 최대값과 최소값을 제외한 나머지 값들을 평균냄
                    {
                        row[2 + nValuer + 1] = (double)(Util.getSumElements(d) - Util.getMaxElement(d) - Util.getMinElement(d));
                        row[2 + nValuer + 2] = (double)((Util.getSumElements(d) - Util.getMaxElement(d) - Util.getMinElement(d)) / (index - 2));
                    }
                    else // 다면평가자 수가 3명 이하일 경우에는 그냥 평균냄
                    {
                        row[2 + nValuer + 1] = (double)(Util.getSumElements(d));
                        row[2 + nValuer + 2] = (double)(Util.getSumElements(d) / index);

                    }

                }
                
            }
            catch (Exception ex) {

                MessageBox.Show(ex.Message, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;

            }

            MessageBox.Show("계산하였습니다.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

        private void cboElement_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                cboElement.Enabled = false;

                lblTitle.Text = cboElement.Items[cboElement.SelectedIndex].ToString();

                setMTargetToGrid();

                cboElement.Enabled = true;
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace, "확인", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void setMTargetToGrid() {

            tbl.Rows.Clear();           

            // 평가대상자 명단
            ArrayList list = DBUtil.getMTargetList((byte)getTargetType());

            int i = 1;
            foreach (Hashtable tmp in list) //다면평가대상자 전체 루프
            {
                DataRow row = tbl.NewRow();
                row[0]= i.ToString();
                row[1] = (string)tmp["TARGET_PCODE"];
                row[2] = (string)tmp["TARGET_NAME"];
                tbl.Rows.Add(row);

                i++;
                
            }

            /* ***************************
             * 평가대상자의 요소별 점수
             * ***************************/            

            int valuer_num = Config.ValuerList.Count;
                        
            
            for (int j = 0; j < list.Count;j++ ) //다면평가대상자 전체 루프
            {
                DataRow row = tbl.Rows[j];

                for (int k = 0; k < valuer_num; k++)
                {
                    string fn = fieldName[cboElement.SelectedIndex];
                    string pcode = (string)row[1];
                    string valuer = Config.ValuerList[k].ToString();
                    row[(string)colNames[3 + k]] = DBUtil.getMElementValue(fn, pcode, valuer);

                }

                //요소, 평균
                ArrayList data = DBUtil.getElementInfo(row[colNames[1].ToString()].ToString(), (cboElement.SelectedIndex + 1).ToString());
                if (data.Count > 0)
                {
                    row["계"] = data[0].ToString();
                    row["평균"] = data[1].ToString();
                }
            }

            foreach (object tmp in Config.ValuerList)
            {
                grdElementList.Columns[DBUtil.getValuerName(tmp.ToString())].DefaultCellStyle.Format = "#0.000";
                grdElementList.Columns[DBUtil.getValuerName(tmp.ToString())].Width = 70;
            }

        }

        private byte getTargetType()
        {
            return (byte)parent.tscTargetType.SelectedIndex;
        }

        private void btnClose_Click(object sender, EventArgs e)
        {

            this.Close();

            tbl.Dispose();

            parent.stateRefresh();
            FormMain.setMnuSumOfElementEnabled();
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                //항목 선택 여부 확인
                if (cboElement.SelectedIndex == -1)
                {
                    MessageBox.Show("요소 항목을 먼저 선택해주세요!    ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                //계산여부 확인
                DataRow row = tbl.Rows[0];
                int valuer_num = DBUtil.getValuerList().Count;
                if (valuer_num < 3)
                {
                    MessageBox.Show("3명 이상의 다면평가자 엑셀 파일을 읽으시고, 평균을 계산한 다음 저장하세요.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

                if (row["계"].ToString().Equals("") == false)
                {
                    for (int i = 0; i < tbl.Rows.Count; i++)
                    {
                        row = tbl.Rows[i];

                        ArrayList data = new ArrayList();
                        data.Add(row["개인번호"]);
                        data.Add(row["계"]);
                        data.Add(row["평균"]);

                        DBUtil.writeElementsInfo(data, (cboElement.SelectedIndex + 1).ToString());
                    }                   

                }
                else
                {
                    MessageBox.Show("계산 버튼을 클릭하여 요소별 계와 평균을 계산한 다음 저장을 해야합니다.   ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            MessageBox.Show("계산 결과를 저장하였습니다.    ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void btnXls_Click(object sender, EventArgs e)
        {
            if (cboElement.SelectedIndex >= 0)
            {
                Thread t = new Thread(new ThreadStart(xlsPrint));
                t.Start();
            }
            else
            {
                MessageBox.Show("평가요소를 먼저 선택하세요.    ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void xlsPrint()
        {
            try
            {
                if (File.Exists(Application.StartupPath + "\\MultiElement") == true)
                {                    

                    //엑셀 파일 열기
                    Util.openXls(Application.StartupPath + "\\MultiElement");

                    //평가요소
                    Excel.Range range = Util.OSheet.get_Range("C2", Missing.Value);
                    range.set_Value(Missing.Value, cboElement.Items[cboElement.SelectedIndex]);

                    //다면평가자 정보
                    ArrayList multiValuer = Config.ValuerList;

                    //다면평가자 수
                    int multiValuerCount = multiValuer.Count;

                    if (multiValuerCount < 3)
                    {
                        MessageBox.Show("다면평가 정보를 모두 입력하신 후 인쇄하세요!    ","확인");
                        return;
                    }

                    //다면평가자 수 만큼 열 추가
                    if (multiValuerCount > 3)
                    {

                        range = Util.OSheet.get_Range("E1", "E65000");

                        for (int i = 0; i < multiValuerCount - 3; i++)
                        {
                            range.Insert(Excel.XlInsertShiftDirection.xlShiftToRight, Missing.Value);
                        }

                    }

                    //다면평가자 성명 세팅
                    for (int i = 0; i < multiValuerCount; i++)
                    {
                        //MessageBox.Show(Config.xlsColumn[i + 2] + "4");
                        range = Util.OSheet.get_Range(Config.xlsColumn[i + 2] + "4", Missing.Value);
                        range.set_Value(Missing.Value, DBUtil.getMTargetName(multiValuer[i].ToString()));
                        range.ColumnWidth = 6;
                    }

                    //선택한 평가요소에 대해 다면평가대상자 마다 다면평가자의 배점과 계 및 평균을 세팅함
                    ArrayList list = DBUtil.getMTargetListFromSMULTITABLE(getTargetType(), (cboElement.SelectedIndex + 1).ToString());
                    for (int i = 0; i < list.Count; i++)
                    {
                        ArrayList pcode = (ArrayList)list[i];

                        //연번
                        range = Util.OSheet.get_Range("A" + (5 + i).ToString(), Missing.Value);
                        range.set_Value(Missing.Value, (i + 1).ToString());

                        //성명
                        range = Util.OSheet.get_Range("B" + (5 + i).ToString(), Missing.Value);
                        range.set_Value(Missing.Value, DBUtil.getMTargetName(pcode[0].ToString()));

                        //열 인덱스
                        int rowIndex = 3;

                        //다면평가자별 평가점
                        for (int j = 0; j < multiValuerCount; j++)
                        {
                            range = Util.OSheet.get_Range(Config.xlsColumn[j + 2] + (i + 5).ToString(), Missing.Value);
                            if (pcode[0].ToString().Equals(multiValuer[j].ToString()) == true)
                            {
                                range.set_Value(Missing.Value, "-");
                            }
                            else
                            {
                                range.set_Value(Missing.Value, DBUtil.getMElementValue(fieldName[cboElement.SelectedIndex], pcode[0].ToString(), multiValuer[j].ToString()).ToString("##.000"));
                            }
                            rowIndex++;
                        }

                        //계
                        ArrayList point = DBUtil.getItemFromSMULTITABLE((cboElement.SelectedIndex + 1).ToString(), pcode[0].ToString());
                        range = Util.OSheet.get_Range(Config.xlsColumn[rowIndex-1] + (i + 5).ToString(), Missing.Value);
                        range.set_Value(Missing.Value, Double.Parse(point[0].ToString()));

                        range = Util.OSheet.get_Range(Config.xlsColumn[rowIndex] + (i + 5).ToString(), Missing.Value);
                        range.set_Value(Missing.Value, Double.Parse(point[1].ToString()));
                    }

                    int entireColumnCount = 2 + multiValuerCount + 2;
                    range = Util.OSheet.get_Range("A5", Config.xlsColumn[entireColumnCount - 1] + (4 + Config.NumOfTagets).ToString());
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeLeft].Weight = Excel.XlBorderWeight.xlThin;
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeRight].Weight = Excel.XlBorderWeight.xlThin;
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlEdgeBottom].Weight = Excel.XlBorderWeight.xlThin;
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].Weight = Excel.XlBorderWeight.xlThin;
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].Weight = Excel.XlBorderWeight.xlThin;

                    PrintDialog dlg = new PrintDialog();
                    dlg.AllowSomePages = true;
                    dlg.AllowCurrentPage = true;
                    dlg.AllowPrintToFile = false;
                    if (dlg.ShowDialog() == DialogResult.OK)
                    {
                        int startPage = dlg.PrinterSettings.FromPage;
                        int endPage = dlg.PrinterSettings.ToPage;
                        Util.OSheet.PageSetup.CenterHorizontally = true;
                        if (startPage > 0 && endPage > 0)
                        {
                            Util.OWorkBook.PrintOut(startPage, endPage, dlg.PrinterSettings.Copies, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                        }
                        else
                        {
                            Util.OWorkBook.PrintOut(Missing.Value, Missing.Value, dlg.PrinterSettings.Copies, false, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                        }
                    }
                    dlg.Dispose();
                    
                    Util.closeXls();

                }
                else
                {
                    MessageBox.Show("프로그램 구성요소 중 일부가 제거되었습니다. 새로 설치하십시오.    ", "확인", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace, "오류",MessageBoxButtons.OK,MessageBoxIcon.Error);
                Util.closeXls();
            }
        
        }
    }
}
